SGDT QWORD PTR DST
SIDT QWORD PTR DST
SMSW DST
CLTS
HLT
LGDT QWORD PTR SRC
LIDT QWORD PTR SRC
LMSW DST
MOV DST,SRC
LLDT SRC
SLDT DST
LTR SRC
STR DST
ARPL OPRD1,OPRD2
LAR OPRD1,OPRD2
LSL OPRD1,OPRD2
VERR OPRD
VERW OPRD
;名称:ASM8.ASM ;功能:显示关键寄存器内容及说明操作系统类指令的使用 ;编译:TASM ASM8.ASM ;连接:TLINK ASM8.OBJ ;---------------------------------------------------------------------------- INCLUDE 386SCD.INC ;---------------------------------------------------------------------------- GDTSeg SEGMENT PARA USE16 ;全局描述符表数据段(16位) ;---------------------------------------------------------------------------- GDT LABEL BYTE ;空描述符 DUMMY Desc <> ;规范段描述符及选择子 Normal Desc <0ffffh,,,ATDW,,> Normal_Sel = Normal-GDT ;---------------------------------------------------------------------------- EFFGDT LABEL BYTE ;临时任务代码段描述符及选择子 TempCode Desc <0ffffh,TempCodeSeg,,ATCE,,> TempCode_Sel = TempCode-GDT ;缓冲区段描述符及选择子 Buffer Desc <BufferLen-1,BufferSeg,,ATDW,,> Buffer_Sel = Buffer-GDT ;测试描述符1及选择子 Test1 Desc <1111h,,,92h,87h,> Test1_Sel = Test1-GDT TestR_Sel = Test1-GDT+RPL3 ;测试描述符2及选择子 Test2 Desc <2222h,,,82h,17h,> Test2_Sel = Test1-GDT ;---------------------------------------------------------------------------- GDNum = ($-EFFGDT)/(SIZE Desc) ;需特殊处理的描述符数 GDTLen = $-GDT ;全局描述符表长度 ;---------------------------------------------------------------------------- GDTSeg ENDS ;全局描述符表段定义结束 ;---------------------------------------------------------------------------- BufferSeg SEGMENT PARA USE16 ;缓冲区数据段 ;---------------------------------------------------------------------------- GDTR_V PDesc <> ;存放GDTR IDTR_V PDesc <> ;存放IDTR ;---------------------------------------------------------------------------- MSW_V DW 0 ;存放机器状态字 LDTR_V DW 0 ;存放LDTR选择子 TR_V DW 0 ;存放TR选择子 CR0_V DD 0 ;存放控制寄存器CR0 CR3_V DD 0 ;存放控制寄存器CR3 DR7_V DD 0 ;存放调试寄存器DR7 Test_RPL DW 0 ;---------------------------------------------------------------------------- Test1_SLD DD 0 ;演示用变量 Test1_ARD DD 0 Test1_SLW DW 0 Test1_ARW DW 0 Test1_RF DW 0 Test1_WF DW 0 ;---------------------------------------------------------------------------- Test2_SLD DD 0 ;演示用变量 Test2_ARD DD 0 Test2_SLW DW 0 Test2_ARW DW 0 Test2_RF DW 0 Test2_WF DW 0 ;---------------------------------------------------------------------------- BufferLen = $ BufferSeg ENDS ;---------------------------------------------------------------------------- TempCodeSeg SEGMENT PARA USE16 ;临时代码段 ASSUME CS:TempCodeSeg,DS:BufferSeg ;---------------------------------------------------------------------------- Virtual PROC FAR mov ax,Buffer_Sel mov ds,ax mov eax,cr0 ;存储CR0 mov CR0_V,eax mov eax,cr3 ;存储CR3 mov CR3_V,eax mov eax,DR7 ;存储DR7 mov DR7_V,eax str TR_V ;存储TR sldt LDTR_V ;存储LDTR mov Test_RPL,Test1_Sel mov ax,TestR_Sel arpl Test_RPL,ax ;说明调整申请特权及指令 mov bx,0 mov ax,Test1_Sel Lab1: mov edx,0 mov cx,0 lsl edx,eax ;说明装载段界限指令 lsl cx,ax mov Test1_SLD[bx],edx mov Test1_SLW[bx],cx mov edx,0 mov cx,0 lar edx,eax ;说明装载存取权指令 lar cx,ax mov Test1_ARD[bx],edx mov Test1_ARW[bx],cx mov Test1_RF[bx],0 verr ax ;说明读检验指令 jnz Lab2 mov Test1_RF[bx],1 Lab2: mov Test1_WF[bx],0 verw ax ;说明写检验指令 jnz Lab3 mov Test1_WF[bx],1 Lab3: add bx,16 mov ax,Test2_Sel cmp bx,32 jb Lab1 ;准备返回实方式 mov ax,Normal_Sel mov ds,ax mov eax,cr0 and al,11111110b mov cr0,eax ;返回实方式 JUMP16 <SEG Real>,<OFFSET Real> Virtual ENDP ;---------------------------------------------------------------------------- TempCodeSeg ENDS ;---------------------------------------------------------------------------- RCodeSeg SEGMENT PARA USE16 ASSUME CS:RCodeSeg,DS:BufferSeg ;---------------------------------------------------------------------------- VGDTR PDesc <GDTLen-1,> ;---------------------------------------------------------------------------- Start PROC mov ax,BufferSeg mov ds,ax sgdt GDTR_V sidt IDTR_V smsw MSW_V ;准备转入保护方式 push cs pop ds cld call InitGDT mov bx,OFFSET VGDTR lgdt [bx] cli mov eax,cr0 or al,1 ;转入保护方式 mov cr0,eax JUMP16 <TempCode_Sel>,<OFFSET Virtual> Real: ;回到实方式 sti ;为了简单,略去了显示相关变量内容的部分代码 mov ax,4c00h int 21h Start ENDP ;---------------------------------------------------------------------------- InitGDT PROC push ds mov ax,GDTSeg mov ds,ax mov cx,GDNum mov si,OFFSET EFFGDT InitG: mov ax,[si].BaseL movzx eax,ax shl eax,4 shld edx,eax,16 mov WORD PTR [si].BaseL,ax mov BYTE PTR [si].BaseM,dl mov BYTE PTR [si].BaseH,dh add si,SIZE Desc loop InitG pop ds mov bx,16 mov ax,GDTSeg mul bx mov WORD PTR VGDTR.Base,ax mov WORD PTR VGDTR.Base+2,dx ret InitGDT ENDP ;---------------------------------------------------------------------------- RCodeSeg ENDS END Start
特 权 指 令 |
指 令 | 功 能 | 指 令 | 功 能 |
CLTS | 清除CR0中的TS位 | LTR | 装入TR寄存器 | |
HLT | 停机 | MOV CRn,reg | 装入控制寄存器 | |
LGDT | 装入GDTR寄存器 | MOV reg,CRn | 保存控制寄存器 | |
LIDT | 装入IDTR寄存器 | MOV DRn,reg | 装入调试寄存器 | |
LLDT | 装入LDTR寄存器 | MOV reg,DRn | 保存调试寄存器 | |
LMSW | 装入MSW寄存器(CR0的低16位) |
参考资料 | 书 名 | 出 版 社 | 作 者 |
《保护方式下的80386及其编程》 | 清华大学出版社 | 周明德主编 | |
《80X86汇编语言程序设计教程》 | 清华大学出版社 | 扬季文主编 |